/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *    Copyright (c) 2019 Google LLC.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

#pragma once

#include <stdbool.h>
#include <stdint.h>
#include "BaseApplication.h"
#include "AppEvent.h"
#include "FreeRTOS.h"
#include "led_strip_driver.h"
#include "sl_simple_button_instances.h"

#include "timers.h" // provides FreeRTOS timer support
#include <app/clusters/identify-server/identify-server.h>
#include <ble/BLEEndPoint.h>
#include <lib/core/CHIPError.h>
#include <platform/CHIPDeviceLayer.h>

// Application-defined error codes in the CHIP_ERROR space.
#define APP_ERROR_EVENT_QUEUE_FAILED CHIP_APPLICATION_ERROR(0x01)
#define APP_ERROR_CREATE_TASK_FAILED CHIP_APPLICATION_ERROR(0x02)
#define APP_ERROR_UNHANDLED_EVENT CHIP_APPLICATION_ERROR(0x03)
#define APP_ERROR_CREATE_TIMER_FAILED CHIP_APPLICATION_ERROR(0x04)
#define APP_ERROR_START_TIMER_FAILED CHIP_APPLICATION_ERROR(0x05)
#define APP_ERROR_STOP_TIMER_FAILED CHIP_APPLICATION_ERROR(0x06)

class AppTask : public BaseApplication
{


public:
    AppTask() = default;
    static AppTask & GetAppTask() { return sAppTask; }
    CHIP_ERROR StartAppTask();
    
    static void AppTaskMain(void * pvParameter);

    void ButtonEventHandler(const sl_button_t * buttonHandle, uint8_t btnAction) override;

    static void OnIdentifyStart(Identify * identify);
    static void OnIdentifyStop(Identify * identify);
    void PostStripControlActionRequest(int32_t aActor, MyLedStrip::action_t aAction, uint8_t value);

private:
    friend AppTask & GetAppTask(void);

    CHIP_ERROR Init();
    static AppTask sAppTask;
    static void ButtonHandler(AppEvent * aEvent);

    static void StripControlEventHandler(AppEvent * aEvent);
    static void SwitchActionEventHandler(AppEvent * aEvent);
  
};
